# 从 flask 模块导入 Blueprint、request 和 jsonify 类
# Blueprint 用于创建 Flask 应用的蓝图，方便组织路由
# request 用于处理客户端的 HTTP 请求
# jsonify 用于将 Python 字典或列表转换为 JSON 响应
from flask import Blueprint, request, jsonify
# 从 flask_jwt_extended 模块导入 create_access_token 函数，用于创建 JWT 访问令牌
from flask_jwt_extended import create_access_token
# 从 app 包中导入 LogService 类，用于记录日志
from app import LogService
# 从 app.models 模块导入 Passenger 类，用于处理乘客相关的数据操作
from app.models import Passenger
# 从 presenter 模块导入 PassengerPresenter 类，用于处理乘客数据的展示逻辑
from presenter import PassengerPresenter
# 从 utils 模块导入 StateCode 类和 create_response 函数
# StateCode 用于定义响应状态码
# create_response 用于创建统一格式的响应
from utils import StateCode, create_response

# 创建一个名为 'login' 的蓝图
login_bp = Blueprint('login', __name__)

@login_bp.route('/login', methods=['POST'])
def login():
    """
    处理用户登录请求。

    该函数接收一个包含账户名和密码的 POST 请求，
    验证账户名和密码是否正确，若正确则生成 JWT 访问令牌，
    并返回包含用户信息和令牌的响应。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码的元组。
    """
    # 从请求的 JSON 数据中获取所有信息
    data = request.json
    # 从数据中提取账户名
    account = data.get('account')
    # 从数据中提取密码
    password = data.get('password')

    # 检查账户名或密码是否为空
    if not account or not password:
        # 若为空，使用 create_response 函数创建包含参数错误状态码的响应
        return jsonify(create_response(StateCode.PARAMS_ERROR)), 400

    # 调用 Passenger 类的 verifyPassenger 方法验证账户名和密码
    user = Passenger.verifyPassenger(account, password)

    # 检查用户是否存在（即验证是否成功）
    if user:
        # 若验证成功，使用 create_access_token 函数为用户创建 JWT 访问令牌
        access_token = create_access_token(identity=user.id)
        # 使用 PassengerPresenter 类处理用户信息，并将令牌添加到展示数据中
        user_presenter = PassengerPresenter(user, {"token": access_token}).as_dict()
        # 调用 LogService 的 log 方法记录日志
        LogService.log()
        # 使用 create_response 函数创建包含成功状态码和用户展示数据的响应
        return jsonify(create_response(StateCode.SUCCESS, data=user_presenter)), 200

    # 若验证失败，使用 create_response 函数创建包含密码错误状态码的响应
    return jsonify(create_response(StateCode.PASSWORD_INCORRECT)), 400